package com.example.jedis.client.command.string;

public interface RedisStringCommand {
    /**
     *  将字符串值 value 关联到 key 。
     *  如果 key 已经持有其他值， SET 就覆写旧值，无视类
     *  对于某个原本带有生存时间（TTL）的键来说， 当 SET 命令成功在这个键上执行时， 这个键原有的 TTL 将被清除。
     *
     *  从 Redis 2.6.12 版本开始， SET 命令的行为可以通过一系列参数来修改：
     *  EX second ：设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
     *  PX millisecond ：设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
     *  NX ：只在键不存在时，才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。
     *  XX ：只在键已经存在时，才对键进行设置操作。
     *
     * 从 Redis 2.6.12 版本开始， SET 在设置操作成功完成时，才返回 OK 。
     * 如果设置了 NX 或者 XX ，但因为条件没达到而造成设置操作未执行，那么命令返回空批量回复（NULL Bulk Reply）。
     *
     * Command: [set] [user.name.110] [pingking]
     * write :[
     *         *3\r\n
     *         $3\r\n
     *         set\r\n
     *         $13\r\n
     *         user.name.110\r\n
     *         $8\r\n
     *         pingking\r\n
     *         ]
     * read :[+OK\r\n]
     *
     *  @param key
     *  @param value
     *  @return  OK
     */
    public String  set(String key, String value);

    /**
     * NX ：只在键不存在时，才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。
     *
     * Command: [set] [user.name.110] [pingking] [NX] : [OK]
     * write :[*4\r\n$3\r\nset\r\n$13\r\nuser.name.110\r\n$8\r\npingking\r\n$2\r\nNX\r\n]
     * read :[+OK\r\n]
     *
     * Command: [set] [user.name.110] [pingking] [NX] : [null]
     * write :[*4\r\n$3\r\nset\r\n$13\r\nuser.name.110\r\n$8\r\npingking\r\n$2\r\nNX\r\n]
     * read :[$-1\r\n]
     * @param key
     * @param value
     * @return OK 或 null
     */
    public String setNX(String key, String value);

    /**
     * XX ：只在键已经存在时，才对键进行设置操作。
     * SET exists-key "new-value" XX
     *
     *  Command: [set] [user.name.110] [pingking] [XX] : [null]
     *  write :[*4\r\n$3\r\nset\r\n$13\r\nuser.name.110\r\n$8\r\npingking\r\n$2\r\nXX\r\n]
     *   read :[$-1\r\n]
     *
     *  Command: [set] [user.name.110] [pingking] [XX] : [OK]
     *  write :[*4\r\n$3\r\nset\r\n$13\r\nuser.name.110\r\n$8\r\npingking\r\n$2\r\nNX\r\n]
     *  read :[+OK\r\n]
     *
     * @param key
     * @param value
     * @return OK 或 null
     */
    public String setXX(String key, String value);

    /**
     * EX second ：设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
     * SET key "hello" EX 10086
     * @param key
     * @param value
     * @param expireSeconds
     * @return  "OK"
     */
    public String  set(String key, String value,int expireSeconds);

    /**
     * NX ：只在键不存在时，才对键进行设置操作。
     * EX second ：设置键的过期时间为 second 秒。
     * SET key-with-expire-and-NX "hello" EX 10086 NX
     *
     *
     * @param key
     * @param value
     * @param expireSeconds
     * @return OK 或 NULL
     */
    public String setNX(String key, String value,int expireSeconds);
    /**
     * XX ：只在键已经存在时，才对键进行设置操作。
     * EX second ：设置键的过期时间为 second 秒。
     * SET key-with-expire-and-NX "hello" EX 10086 XX
     * @param key
     * @param value
     * @param expireSeconds
     * @return OK 或 NULL
     */

    public String setXX(String key, String value,int expireSeconds);




    /**
     *  返回 key 所关联的字符串值。
     *  如果 key 不存在那么返回特殊值 null 。
     *  假如 key 储存的值不是字符串类型，返回一个错误，因为 GET 只能用于处理字符串值。
     *
     *  Command: [get] [kk]  : [null]
     *  write :[*2\r\n$3\r\nget\r\n$2\r\nkk\r\n]
     *  read :[$-1\r\n]
     *
     *  Command: [get] [user.name.110]  : [pingking]
     *  write :[*2\r\n$3\r\nget\r\n$13\r\nuser.name.110\r\n]
     *  read :[$8\r\npingking\r\n]

     * @param key
     * @return  key对应的值 或 null
     */
    public String get(String key);


}
